#include "temu.h"
#include <stdlib.h>

CPU_state cpu;
CP0_t cp0;

const char *regfile[] = {"$zero", "$at", "$v0", "$v1", "$a0", "$a1", "$a2", "$a3", "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6", "$s7", "$t8", "$t9", "$k0", "$k1", "$gp", "$sp", "$fp", "$ra"};
const char *cp0file[] = {"$Index", "$Random", "$EntryLo0", "$EntryLo1", "$Context", "$Pagemask", "$Wired", "$Reserved", "$BadVAddr", "$Count", "$EntryHi", "$Compare", "$Status", "$Cause", "$EPC", "$PRId"};

void display_reg() {
        int i;
        for(i = 0; i < 32; i ++) {
                printf("%s\t\t0x%08x\t\n", regfile[i], cpu.gpr[i]._32);
        }

        printf("%s\t\t0x%08x\t\n", "$pc", cpu.pc);
}

void display_cp0() {
	int i;
        for(i = 0; i < 16; i ++) {
                printf("%s\t\t0x%08x\t\n", cp0file[i], cp0.cp0_gpr[i]);
        }
}

uint32_t get_reg_val(const char *s, bool *success) {
	int i;
	*success = true;
	for(i = 0; i < 32; i ++)
	        if(strcmp(regfile[i], s) == 0) return reg_w(i);
	for(i = 0; i < 16; i ++)
		if(strcmp(cp0file[i], s) == 0) return cp0_w(i);

	if(strcmp("$pc", s) == 0)
	        return cpu.pc;

	// *success = false;
	return 0;
}